﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Windows;
using System.Windows.Threading;

namespace Xceed.Silverlight.ListBox
{
  #region metadata

  [TemplateVisualState( GroupName = "RequestStates", Name = "NoPendingRequests" )]
  [TemplateVisualState( GroupName = "RequestStates", Name = "RequestsPending" )]

  #endregion
  public class LoadingIndicator : IndicatorBase
  {
    public LoadingIndicator()
    {
      this.DefaultStyleKey = typeof( LoadingIndicator );
      this.IsTabStop = false;
      UpdateRequestStates( false );
    }

    #region RequestsPending Property

    public static readonly DependencyProperty RequestsPendingProperty = DependencyProperty.Register(
      "RequestsPending",
      typeof( bool ),
      typeof( LoadingIndicator ),
      new PropertyMetadata(
        ( bool )false,
        new PropertyChangedCallback( LoadingIndicator.OnRequestsPendingChanged ) ) );

    public bool RequestsPending
    {
      get
      {
        return ( bool )this.GetValue( LoadingIndicator.RequestsPendingProperty );
      }
      set
      {
        this.SetValue( LoadingIndicator.RequestsPendingProperty, value );
      }
    }

    private static void OnRequestsPendingChanged( DependencyObject sender, DependencyPropertyChangedEventArgs e )
    {
      LoadingIndicator indicator = sender as LoadingIndicator;

      indicator.UpdateRequestStates( true );
    }

    #endregion

    internal override void OnKillTimerTick( object sender, EventArgs e )
    {
      DispatcherTimer killTimer = sender as DispatcherTimer;

      if( ( !killTimer.IsEnabled ) || ( this.RequestsPending ) )
        return;

      base.OnKillTimerTick( sender, e );
    }

    protected void UpdateRequestStates( bool useTransitions )
    {
      if( this.RequestsPending )
      {
        VisualStateManager.GoToState( this, "RequestsPending", useTransitions );

        this.StartTimer();
        this.StopKillTimer();
      }
      else
      {
        VisualStateManager.GoToState( this, "NoPendingRequests", useTransitions );

        this.StartKillTimer();
      }
    }

  }
}
